/** @file CommonMacro.h */
#ifndef GCLMACRO_H_
#define GCLMACRO_H_
#ifndef PLATFORM_WIN32
#include <sys/wait.h>
#endif
namespace Common
{
/**
 @def GCL_MIN
 @brief 计算a,b中的最小值
 @param a 	a numeric value.
 @param b	a numeric value.
 @return		the minimum of a and b.
 */
#define GCL_MIN(a, b)  (((a) < (b)) ? (a) : (b))

/**
 @def GCL_MAX
 @brief 计算a,b中的最大值
 @param a 	a numeric value.
 @param b	a numeric value.
 @return		the maximum of a and b.
 */
#define GCL_MAX(a, b)  (((a) > (b)) ? (a) : (b))

/**
 @def GCL_ABS
 @brief 计算a的绝对值
 @param a 	a numeric value.
 @return		the absolute of a.
 */
#define GCL_ABS(a)	   (((a) < 0) ? -(a) : (a))

/**
 @def GCL_CLAMP
 @brief 确保返回在low和high中间的值, 如果low > high 结果将不确定.
 @param x 	the value to clamp.
 @param low	the minimum value allowed.
 @param high	the maximum value allowed.
 @return		the value of x clamped to the range between low and high.
 */
#define GCL_CLAMP(x, low, high)  (((x) > (high)) ? (high) : (((x) < (low)) ? (low) : (x)))

/**
 @def GCL_RETURN_IF_FAIL
 @brief 如果expr不为真，从当前函数返回。
 @param expr 	the expression to check.
 */
#define GCL_RETURN_IF_FAIL(expr) { if(!(expr)) return; }

/**
 @def GCL_RETURN_VAL_IF_FAIL
 @brief 如果expr不为真，从当前函数返回val。
 @param expr the expression to check.
 @param val 	返回值
 */
#define GCL_RETURN_VAL_IF_FAIL(expr,val) {if(!(expr)) return(val);}

/**
 @def GCL_BIT_VAL_TEST
 @brief 返回val对应位置的BIT值。
 @param val the expression to Test.
 @param offset bit位
 */
#define GCL_BIT_VAL_TEST(val,offset) (((val) & (1ll<<offset))!=0)

/**
 @def GCL_BIT_VAL_SET
 @brief 返回val对应位置的BIT值。
 @param val the expression to Test.
 @param offset bit位
 */
#define GCL_BIT_VAL_SET(val,offset) (val=((val)|(1ll<<(offset))))

/**
 @def GCL_BIT_VAL_CLEAR
 @brief 返回val对应位置的BIT值。
 @param val the expression to Test.
 @param offset bit位
 */
#define GCL_BIT_VAL_CLEAR(val,offset) (val=((val)&(~(1ll<<(offset)))))

/**
 @def START_PROCESS
 @brief 如果expr为真，从当前函数返回val。
 @param expr the expression to check.
 @param val 	返回值
 */
#ifndef PLATFORM_WIN32
#define GCL_START_PROCESS( file, cmd, ... ) \
{\
	int status;\
	pid_t pid = fork( );\
	if ( pid  == 0 )\
	{\
		execlp ( file, cmd, ##__VA_ARGS__ );\
		exit ( -1 );\
	}\
	waitpid ( pid, &status, 0 );\
}
#endif
}
#endif /*GCLMACRO_H_*/
